package indi.wrenn.studentsystem.frame;

import indi.wrenn.studentsystem.bean.Student;
import indi.wrenn.studentsystem.dao.ManageHelper;
import indi.wrenn.studentsystem.util.Tools;
import indi.wrenn.studentsystem.util.WindowUtil;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 * 成绩分析选项对话框
 * 用于选择年级、院系、专业、班级来进行成绩分析
 */
public class ScoreAnalyzeOption extends JDialog{
	// 界面组件定义
	private JButton confirm_Button;    // "确定"按钮
	private JButton cancel_Button;     // "取消"按钮
	private JComboBox major_Box;       // "专业"下拉框
	private JComboBox department_Box;  // "所属院系"下拉框
	private JLabel classe_Label;       // "班级"标签
	private JLabel grade_Label;        // "年级"标签
	private JLabel major_Label;        // "专业"标签
	private JLabel department_Label;   // "所属院系"标签
	private JTextField student_IDText; // "学号"文本框
	private JTextField student_NameText; // "姓名"文本框
	private JComboBox classe_Box;      // "班级"下拉框
	private JComboBox grade_Box;       // "年级"下拉框

	// 数据相关变量
	private JDialog jd;                // 当前窗口引用
	private HashMap<String, String> departments; // 院系数据集合（名称->ID）
	private HashMap<String, String> all_Major;   // 所有专业数据集合（名称->ID）
	private Vector<String> majors;     // 专业名称集合
	private ManageHelper helper;       // 数据库操作辅助类
	private Vector<String> classes;    // 班级集合

	/**
	 * 构造函数
	 * @param owner 父窗口
	 * @param title 对话框标题
	 * @param modal 是否为模态对话框
	 */
	public ScoreAnalyzeOption(JFrame owner, String title, boolean modal){
		super(owner, title, modal);

		// 初始化数据库操作辅助类
		helper = new ManageHelper();
		// 从数据库获取所有院系数据
		departments = this.helper.getAllDepartment();
		// 从数据库获取所有专业数据
		all_Major = this.helper.getAllMajor();

		// 设置当前窗口引用
		this.jd = this;
		// 设置窗口大小
		this.setSize(350,300);
		// 设置为绝对布局
		this.setLayout(null);

		// 初始化并添加年级标签
		grade_Label = new JLabel("年级:");
		grade_Label.setBounds(78, 48, 30, 20);
		this.add(grade_Label);

		// 初始化年级下拉框，使用Tools类生成年级数据
		grade_Box = new JComboBox<String>(Tools.CreateGrade());
		grade_Box.setBounds(116, 48, 150, 20);

		// 为年级下拉框添加事件监听器
		grade_Box.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// 清空班级下拉框中的所有项
				classe_Box.removeAllItems();
				// 获取当前选择的专业名称
				String option = major_Box.getSelectedItem().toString();
				// 根据专业名称获取专业ID
				String major_id = all_Major.get(option);
				// 获取当前选择的年级
				String grade = grade_Box.getSelectedItem().toString();

				// 如果年级不为空，则查询对应的班级数据
				if(!grade.equals("")){
					classes = helper.getAllClasse(grade, major_id);
					// 将班级数据添加到下拉框中
					for(String s : classes){
						classe_Box.addItem(s);
					}
				}
			}
		});
		this.add(grade_Box);

		// 初始化并添加院系标签
		department_Label = new JLabel("院系:");
		department_Label.setBounds(78, 88, 30, 20);
		this.add(department_Label);

		// 初始化院系下拉框，使用院系名称集合
		department_Box = new JComboBox(departments.keySet().toArray());

		// 为院系下拉框添加事件监听器
		department_Box.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// 清空专业下拉框中的所有项
				major_Box.removeAllItems();
				// 获取当前选择的院系名称
				String option = department_Box.getSelectedItem().toString();
				// 根据院系名称获取院系ID
				String department_ID = departments.get(option);

				// 如果院系ID不为空，则查询对应的专业数据
				if(!department_ID.equals("")){
					majors = helper.getMajor(department_ID);
					// 将专业数据添加到下拉框中
					for(String s : majors){
						major_Box.addItem(s);
					}
				}
			}
		});
		department_Box.setBounds(116, 88, 150, 20);
		this.add(department_Box);

		// 初始化并添加专业标签
		major_Label = new JLabel("专业:");
		major_Label.setBounds(78, 136, 30, 20);
		this.add(major_Label);

		// 初始化专业下拉框，初始为空项防止空指针异常
		major_Box = new JComboBox(new String[]{""});

		// 为专业下拉框添加事件监听器
		major_Box.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// 防止空指针异常
				if(major_Box.getSelectedItem() != null){
					if(!major_Box.getSelectedItem().toString().equals("")){
						// 检查年级是否已选择
						if(major_Box.getSelectedItem().toString().equals("") ||
								grade_Box.getSelectedItem() == null ||
								grade_Box.getSelectedItem().toString().equals("")){
							JOptionPane.showMessageDialog(jd, "年级不能为空", "", JOptionPane.WARNING_MESSAGE);
							major_Box.setSelectedIndex(0);    // 重置为未选择状态
							return;
						}

						// 清空班级下拉框
						classe_Box.removeAllItems();
						// 获取当前选择的专业名称
						String option = major_Box.getSelectedItem().toString();
						// 根据专业名称获取专业ID
						String major_id = all_Major.get(option);
						// 获取当前选择的年级
						String grade = grade_Box.getSelectedItem().toString();

						// 如果年级不为空，则查询对应的班级数据
						if(!grade.equals("")){
							classes = helper.getAllClasse(grade, major_id);
							// 将班级数据添加到下拉框中
							for(String s : classes){
								classe_Box.addItem(s);
							}
						}
					}
				}
			}
		});
		major_Box.setBounds(116, 136, 150, 20);
		this.add(major_Box);

		// 初始化并添加班级标签
		classe_Label = new JLabel("班级:");
		classe_Label.setBounds(78, 184, 30, 20);
		this.add(classe_Label);

		// 初始化班级下拉框，初始为空项防止空指针异常
		classe_Box = new JComboBox(new String[]{""});
		classe_Box.setBounds(116, 184, 150, 20);
		this.add(classe_Box);

		// 初始化确定按钮
		confirm_Button = new JButton("确定");

		// 为确定按钮添加事件监听器
		confirm_Button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// 获取用户选择的各项数据
				String classe = classe_Box.getSelectedItem().toString();
				String grade = grade_Box.getSelectedItem().toString();
				String major_ID = null;
				String major_Name = null;

				// 数据验证部分
				// 检查年级是否为空
				if(grade.equals("")){
					JOptionPane.showMessageDialog(jd, "年级不能为空", "", JOptionPane.WARNING_MESSAGE);
					return;
				}

				// 检查院系是否为空
				if(department_Box.getSelectedItem() == null){
					JOptionPane.showMessageDialog(jd, "院系不能为空", "", JOptionPane.WARNING_MESSAGE);
					return;
				}
				if(department_Box.getSelectedItem().toString().equals("")){
					JOptionPane.showMessageDialog(jd, "院系不能为空", "", JOptionPane.WARNING_MESSAGE);
					return;
				}

				// 检查专业是否为空
				if(major_Box.getSelectedItem() == null){
					JOptionPane.showMessageDialog(jd, "专业不能为空", "", JOptionPane.WARNING_MESSAGE);
					return;
				} else {
					// 获取专业名称和ID
					major_Name = major_Box.getSelectedItem().toString();
					major_ID = all_Major.get(major_Name);
				}

				// 检查专业ID是否为空
				if(major_ID.equals("")){
					JOptionPane.showMessageDialog(jd, "专业不能为空", "", JOptionPane.WARNING_MESSAGE);
					return;
				}

				// 检查班级是否为空
				if(classe.equals("")){
					JOptionPane.showMessageDialog(jd, "班级不能为空", "", JOptionPane.WARNING_MESSAGE);
					return;
				}

				// 所有验证通过，关闭当前对话框并打开成绩分析窗口
				jd.dispose();
				ScoreAnalyzeFrame analyzeFrame = new ScoreAnalyzeFrame(jd,
						major_Name + "专业" + classe + "班的成绩分析", false,
						major_ID, major_Name, grade, classe);
			}
		});
		confirm_Button.setBounds(70, 232, 60, 25);
		this.add(confirm_Button);

		// 初始化取消按钮
		cancel_Button = new JButton("取消");
		cancel_Button.setBounds(230, 232, 60, 25);

		// 为取消按钮添加事件监听器
		cancel_Button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// 关闭当前对话框
				jd.dispose();
			}
		});
		this.add(cancel_Button);

		// 设置窗口居中显示
		WindowUtil.setFrameCenter(this);
		// 设置窗口不可调整大小
		this.setResizable(false);
		// 显示窗口
		this.setVisible(true);
	}
}